package com.senlingspace.payment.douyin;


import com.senlingspace.common.enums.HttpMethod;

/**
 * 抖音接口地址
 *
 * @author lebronjames
 * @date 2024/07/22
 */
public enum DouyinFunctionEnum {



    /**
     * 订单查询
     */
    query_order("订单查询","/goodlife/v1/trade/order/query/", HttpMethod.GET.name()),


    /**
     * 查询门店匹配关系
     */
    query_shop_relation("查询门店匹配关系","/goodlife/v1/poi/match/relation/query", HttpMethod.GET.name()),


    /**
     * 查询门店信息
     */
    query_shop_poi("查询门店信息","/goodlife/v1/shop/poi/query", HttpMethod.GET.name()),


    /**
     * 生成client_token
     *
     * @see <a href="https://developer.open-douyin.com/docs/resource/zh-CN/dop/develop/openapi/account-permission/client-token"/>
     * <p>
     * client_token 用于不需要用户授权就可以调用的接口。
     * client_token 的有效时间为 2 个小时，重复获取 client_token 后会使上次的 client_token 失效（但有 5 分钟的缓冲时间，连续多次获取 client_token 只会保留最新的两个 client_token）。
     */
    create_client_token("生成client_token", "/oauth/client_token/", "post"),

    /**
     * 商品保存/更新
     *
     * @see <a href="https://developer.open-douyin.com/docs/resource/zh-CN/local-life/develop/OpenAPI/goods/save"/>
     * <p>
     * 对于同一服务商，相同的out_id会被认为是同一商品，重复创建会被覆盖(相当于修改)。
     * 商品和SKU属性字段(attr_key_value_map )，需要通过商品模板接口获取
     * 顺序：先上预订商品，再上预售商品，上预售商品时通过 bind_skus 字段关联。
     * 注意：如果预售券为多预订商品多门店的通兑券，则需要在 bind_skus 中绑定多门店的预订商品，且在 pois（适用门店）字段中传入对应预订商品所属的 POI_IDs。
     * product_id: 商品 ID，创建时不必填写，更新时如有 out_id 可不填写
     * spu_id: 创建预定商品（product_type=13）时，传入关联的 SPU ID，由创建票种接口返回；创建预售券（product_type=12）时不传；
     */
    product_save_or_update("商品保存/更新", "/goodlife/v1/goods/product/save/", "post"),

    /**
     * 验券准备
     *
     * @see <a href="https://developer.open-douyin.com/docs/resource/zh-CN/local-life/develop/OpenAPI/life.capacity.fulfilment/certificate.prepare"/>
     * <p>
     * 抖音团购券码的核销, 需要先调用本接口, 查询订单的券列表，选择要验的券，再调用验券接口，核销券码。
     * 抖音团购券码的核销，每次都需要先调用本接口，优先查询订单的券列表，选择要验的券，再调用验券接口，核销券码，验券准备和验券接口的调用次数需要一一对应，如已经调用验券接口验券成功，则当前二维码会失效，无法继续使用验券准备接口，需要使用刷新的二维码再进行调用。
     * 二维码扫出来是一个短链，示例：https://v.douyin.com/eHHc1ft/ ，扫码后并调用本接口可返回当前订单下可用的全部券码信息，如未返回券码信息，则说明该订单此刻无可用券码。
     * <p>
     * 链接中object_id参数的值即为本接口传入的 encrypted_data 参数 I0ZwZEZpb2U1N0pjQVZxS2NJRTFSQW5WK1c4bmxvbnNWdUQ2Wk85Y1N0eHpRUFpMMmZwNTdFM2NKeWlFNDM2QT0
     * <p>
     * 定期清理过期券，在清理前可以获取到已经过期的券，用此券核销会报错。
     * <p>
     * 该接口只返回未使用状态的券信息。
     */
    pre_verify_ticket("验券前置准备", "/goodlife/v1/fulfilment/certificate/prepare/", "get"),

    /**
     * 验券
     *
     * @see <a href="https://developer.open-douyin.com/docs/resource/zh-CN/local-life/develop/OpenAPI/life.capacity.fulfilment/certificate.verify"/>
     * <p>
     * 用于核销券码，同时适用于抖音团购券码与三方券码，抖音券码的核销需要先调用准备接口，再调用本接口，三方券码的核销直接调用本接口即可。
     * <p>
     * 同时适用于抖音团购券码与三方券码
     * <p>
     * 抖音团购券码的核销需要先调用验券准备接口, 再调用本接口
     * <p>
     * 三方券码的核销直接调用本接口即可
     * <p>
     * 可支持多个批量验券, 需为同一个订单，不可跨订单验券, 且三方码场景下必传抖音侧订单 ID 参数
     * <p>
     * error_code、result 均为 0 代表验券成功。error_code非0时则表示调用验券接口失败，建议服务商侧主动发起重试，建议间隔5s发起。第一次调用error_code非0，第二次调用error_code=0且result=1208或2，也可以代表验券成功
     * <p>
     * 三方码同一笔订单下如有多张券，在发起验券的时候，不可同时发起多次请求，需等待前一次请求有响应再发起下次请求
     * <p>
     * 接口报错返回”服务器错误，请稍后重试“、“您的访问过于频繁，请稍后重试”等建议重试的文案后，建议以如下重试策略进行重试，接口成功返回后即可停止重试：
     * - 前5次重试以5s间隔进行
     * - 之后以40s间隔进行
     * - 最高重试14次，如果接口依然报错，请进线反馈
     */
    verify_ticket("验券", "/goodlife/v1/fulfilment/certificate/verify/", "post"),

    /**
     * 撤销核销
     *
     * @see <a href="https://developer.open-douyin.com/docs/resource/zh-CN/local-life/develop/OpenAPI/life.capacity.fulfilment/certificate.cancel"/>
     * <p>
     * 1、针对“抖音团购券码、三方券码”两种券码误核销之后的撤销操作，订单状态由“已使用”回改为“待使用”，用于验券错误需要撤回验券等场景， 有时间限制，验券超过一个小时就不可再撤销。
     * 2、extra.error_code、data.error_code 均为 0 代表撤销成功。
     */
    cancel_verify_ticket("撤销核销", "/goodlife/v1/fulfilment/certificate/cancel/", "post"),

    /**
     * 券状态查询
     *
     * @see <a href="https://developer.open-douyin.com/docs/resource/zh-CN/local-life/develop/OpenAPI/life.capacity.fulfilment/certificate.get"/>
     * <p>
     * 在核销的异常场景情况下，对抖音码团购、次卡券进行状态查询。
     * <p>
     * 1、仅支持查询抖音团购券码的状态
     * 2、该场景常用于核销开放过程中，如存在断网情况下，商家系统没办法及时收到核销状态，增加券状态查询接口，方便商家系统查询券码状态
     * 3、通过验券准备接口返回的加密 code 查询抖音团购券码状态
     * 4、该接口不支持批量查询
     */
    query_ticket_status("券状态查询", "/goodlife/v1/fulfilment/certificate/get/", "get"),

    /**
     * 券状态批量查询
     *
     * @see <a href="https://developer.open-douyin.com/docs/resource/zh-CN/local-life/develop/OpenAPI/life.capacity.fulfilment/certificate.query"/>
     * <p>
     * 用于批量查询抖音券码和三方券码的状态
     * 1、支持查询抖音团购券码和三方券码的状态。
     * 2、核销开放过程中，如存在断网情况下，商家系统没办法及时收到核销状态，增加券状态查询接口，方便商家系统查询券码状态。
     * 3、通过验券准备接口返回的加密 code 查询抖音团购券码状态。
     */
    batch_query_ticket_status("券状态批量查询", "/goodlife/v1/fulfilment/certificate/query/", "get"),

    /**
     * 商户主动发起向用户退款操作
     *
     * @see <a href="https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/server/trade-system/self-operated-trading/refund/init-refund/"/>
     * <p>
     * 一笔订单可以多次退款。微信渠道不超过 50 次，支付宝渠道不超过 300 次。
     * 交易时间超过 1 年的订单无法提交退款。
     * TODO 申请退款接口的返回仅代表业务的受理情况，退款是否成功，
     *  可以在接收退款通知（https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/server/trade-system/self-operated-trading/refund/notify-result）
     *  或者退款查询接口（https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/server/trade-system/self-operated-trading/refund/query-refund）主动获取。
     *  银行卡支付的退款 7 天内到账，支付宝支付（余额、银行卡快捷支付等）的退款 3 个工作日内到账，微信支付（余额、银行卡快捷支付等）的退款 7 天内到账。（退款优先原路退，如用户使用尾号为 1234 的招行借记卡付款，则退款至用户尾号为 1234 的招行借记卡）。
     */
    create_refund("商户发起退款", "/api/apps/trade/v2/refund/create_refund", "post"),

    /**
     * 查询退款单的详情
     * 适用场景举例：查询是否发起退款，查询退款单状态。
     *
     * @see <a href="https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/server/trade-system/self-operated-trading/refund/query-refund" />
     * <p>
     * 支持 refund_id 查询
     * 支持 out_refund_no 查询
     * 支持 order_id 查询
     * 三选一条件查询
     */
    query_refund("查询退款", "/api/apps/trade/v2/refund/query_refund", "post"),

    /**
     * 查询商品模板
     * 用于创建商品前查询商品模板信息。
     * 查询商品模板，创建商品时的属性列表需与该接口保持一致，否则无法识别。根据商品类目及商品类型获取商品模版信息。
     *
     * @see <a href="https://developer.open-douyin.com/docs/resource/zh-CN/local-life/develop/OpenAPI/goods/template.get">...</a>
     * <p>
     * 权限要求
     * - 需要申请权限 ，路径：抖音开放平台-开发者平台/服务商平台>控制台>应用详情>解决方案
     * - 需要商家授权，路径：抖音来客>店铺管理>服务应用授权
     */
    goods_template_get("获取商品模板", "/goodlife/v1/goods/template/get/", "get");

    DouyinFunctionEnum(String name, String url, String method) {
        this.name = name;
        this.url = url;
        this.method = method;
    }

    private final String name;

    private final String url;

    private final String method;

    public String getName() {
        return name;
    }

    public String getUrl() {
        return url.replaceAll("\\.", "/");
    }

    public String getMethod() {
        return method;
    }

}
